package com.wn.mine.widget

import android.content.Context
import android.graphics.Color
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import androidx.databinding.ObservableField
import com.wn.mine.R
import com.wn.mine.databinding.VItemSettingsBinding

/**
 * @Author: wn
 * @Date: 2023/5/5 17:23
 * @Description: 个人中心自定义组件  图标  文字  描述 箭头
 */
// @JvmOverloads可以把多个构造函数合并成一个构造函数
class ItemSettingsView @JvmOverloads constructor(
  context: Context,
  attrs: AttributeSet? = null,
  defStyleAttr: Int = 0,
) :
  ConstraintLayout(context, attrs, defStyleAttr) {
  // 自带默认的  bean
  private var itemSettingsBean = ItemSettingsBean()
  private val observeItemBean = ObservableField(itemSettingsBean)

  init {

    // 1 将 布局文件 绑定到  自定义空间上  attachToRoot  true
    VItemSettingsBinding.inflate(LayoutInflater.from(context), this, true).apply {
      observeBean = observeItemBean
    }
    setBackgroundColor(Color.WHITE)

    /**
     * 方式一 自定义组件 通过 属性 修改 bean 需要 关联 values--xml--resource--declare-styleable
     * 1 定义好自定义属性 declare-styleable--icon--<attr name="icon" format="reference" />
     * 2 自定义控件 传值 app:icon="@drawable/ic_gift_card"
     * 3 obtainStyledAttributes 获取数据 修改 bean
     * 方式二  函数的方式 修改  是 通过自定义组件的实例 来修改 bean 的  itemSettingsView.onClickArrow{ }
     */
    // region 2、读取配置属性,修改 bean
    context.obtainStyledAttributes(attrs, R.styleable.ItemSettingsView).apply {
      itemSettingsBean.apply {
        // icon设置            有默认值
        iconRes = getResourceId(R.styleable.ItemSettingsView_icon, R.drawable.ic_gift_card)
        iconColor = getColor(
          R.styleable.ItemSettingsView_iconColor,
          ContextCompat.getColor(context, com.wn.common.R.color.colorPrimary)
        )
        // title设置
        title = getString(R.styleable.ItemSettingsView_title) ?: ""
//        resources.getColor(com.wn.common.R.color.colorPrimaryText)
        val titleRGB = getColor(
          R.styleable.ItemSettingsView_titleColor,
          ContextCompat.getColor(context, com.wn.common.R.color.colorPrimary)
        )
        titleColor = titleRGB
        // desc设置
        desc = getString(R.styleable.ItemSettingsView_desc) ?: ""
        val descRGB = getColor(R.styleable.ItemSettingsView_descColor, 0)
        descColor = descRGB
        // arrow设置
        arrowRes =
          getResourceId(R.styleable.ItemSettingsView_arrow, com.wn.service.R.drawable.ic_right)
        arrowColor = getColor(R.styleable.ItemSettingsView_arrowColor, 0)
      }
    }.recycle()// TypedArray 回收 recycle
    // endregion
  }
  // region  设置资源
  /**
   * 设置整个item的对象
   * @param itemSettingsBean ItemSettingsBean
   */
  fun setInfo(itemSettingsBean: ItemSettingsBean) {
    this.itemSettingsBean = itemSettingsBean
    observeItemBean.set(itemSettingsBean)
  }

  /**
   * 设置icon图标
   * @param iconRes Any
   */
  fun setIcon(iconRes: Any) {
    itemSettingsBean.iconRes = iconRes
  }

  /**
   * 设置title
   * @param title String
   */
  fun setTitle(title: String) {
    itemSettingsBean.title = title
  }

  /**
   * 设置内容描述
   * @param desc String
   */
  fun setDescOnTime(desc: String) {
    itemSettingsBean.desc = desc
  }

  /**
   * 设置 箭头 图标
   * @param arrowRes Any
   */
  fun setArrow(arrowRes: Any) {
    itemSettingsBean.arrowRes = arrowRes
  }
  // endregion
  // region  设置颜色
  /**
   * 设置icon颜色
   * @param colorRes Int
   */
  fun setIconColor(colorRes: Int) {
    itemSettingsBean.iconColor = colorRes
  }

  /**
   * 设置title标题颜色
   * @param colorRes Int
   */
  fun setTitleColor(colorRes: Int) {
    itemSettingsBean.titleColor = colorRes
  }

  /**
   * 设置desc副标题颜色
   * @param colorRes Int
   */
  fun setDescColor(colorRes: Int) {
    itemSettingsBean.descColor = colorRes
  }

  /**
   * 设置箭头arrow颜色
   * @param colorRes Int
   */
  fun setArrowColor(colorRes: Int) {
    itemSettingsBean.arrowColor = colorRes
  }

  // endregion
  /*
  * 重写拦截事件，
  * 不设置 整个 item全局 点击 不触中 子 Item 才会生效,点击 子Item 子Item响应
  * 设置后  整个Item 任意位置响应  子 Item 不响应  穿透拦截
  * */
  override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
    return hasOnClickListeners()
  }
  // region  点击事件
  /**
   * 单独点击icon
   * @param listener OnClickListener
   */
  fun onClickIcon(listener: OnClickListener) {
    itemSettingsBean.iconListener = listener
  }

  /**
   * 单独点击title
   * @param listener OnClickListener
   */
  fun onClickTitle(listener: OnClickListener) {
    itemSettingsBean.titleListener = listener
  }

  /**
   * 单独点击desc
   * @param listener OnClickListener
   */
  fun onClickDesc(listener: OnClickListener) {
    itemSettingsBean.descListener = listener
  }

  /**
   * 单独点击箭头
   * @param listener OnClickListener
   */
  fun onClickArrow(listener: OnClickListener) {
    itemSettingsBean.arrowListener = listener
  }

  // endregion
}

data class ItemSettingsBean(
  var iconRes: Any = R.drawable.ic_gift_card, // 左边图标 有可能是 int url string, uri
  var iconColor: Int = 0, // icon的颜色
  var title: String = "", // title标题
  var titleColor: Int = com.wn.common.R.color.colorPrimary, // title字的颜色
  var desc: String = "", // 副标题，描述
  var descColor: Int = com.wn.common.R.color.colorSecondaryText, // 副标题字的颜色
  var arrowRes: Any = com.wn.service.R.drawable.ic_right, // 右边箭头图片
  var arrowColor: Int = 0, // 右边箭头图片的颜色
) {
  // itemView的 四个子 view 点击事件

  var iconListener: View.OnClickListener? = null
  var titleListener: View.OnClickListener? = null
  var descListener: View.OnClickListener? = null
  var arrowListener: View.OnClickListener? = null
}